package com.test.redis;

import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * spring redis 工具类
 *
 * @author xpp
 **/
@SuppressWarnings(value = { "unchecked", "rawtypes" })
@Component
public class RedisListCache
{
    @Resource
    public RedisTemplate redisTemplate;

    /**
     * 添加元素到列表头部
     * @param key 列表key
     * @param value 元素值
     */
    public void addLeftPushList(String key, Object value) {
        redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * 添加元素到列表头部
     * @param key 列表key
     * @param value 元素值
     */
    public void addLeftPushListAll(String key, Object value) {
        redisTemplate.opsForList().leftPushAll(key, value);
    }

    /**
     * 添加元素到列表尾部
     * @param key 列表key
     * @param value 元素值
     */
    public void addRightPushList(String key, Object value) {
        redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 获取列表长度
     * @param key 列表key
     * @return 列表长度
     */
    public Long sizeList(String key) {
        return redisTemplate.opsForList().size(key);
    }
    /**
     * list操作
     * 获取
     * @param key 字符串前缀
     * @return 对象列表
     */
    public List<Object> getList(String key) {
        return redisTemplate.opsForList().range(key, 0, -1);
    }
    /**
     * list操作
     * 删除
     * @param key 字符串前缀
     * @return 对象列表
     */
    public void removeFromList(String key, long count, Object value) {
        ListOperations<String, Object> listOps = redisTemplate.opsForList();
        listOps.remove(key, count, value);
    }
    /**
     * 移除并返回列表的第一个元素
     * @param key 列表key
     * @return 元素值
     */
    public Object leftPopList(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 移除并返回列表的最后一个元素
     * @param key 列表key
     * @return 元素值
     */
    public Object rightPopList(String key) {
        return redisTemplate.opsForList().rightPop(key);
    }
    /**
     * 获取列表指定范围内的元素
     * @param key 列表key
     * @param start 起始位置（0表示第一个元素）
     * @param end 结束位置（-1表示最后一个元素）
     * @return 元素列表
     */
    public List<Object> rangeList(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }
}
